﻿function getQueryString(name) {
    var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
    var r = window.location.search.substr(1).match(reg);
    if (r != null) return unescape(r[2]); return null;
}

// 响应拦截器
axios.interceptors.response.use(
    response => {
        // 如果返回的状态码为200，说明接口请求成功，可以正常拿到数据
        // 否则的话抛出错误
        if (response.status === 200) {
            if (response.data.statusCode == 500) {
                errortop(response.data.message);
                return Promise.reject(response.data);
            }
            if (!response.data.data)
                return Promise.resolve(response.data);
            return Promise.resolve(response.data.data);
        } else {
            return Promise.reject(response.data);
        }
    },
    // 服务器状态码不是2开头的的情况
    // 这里可以跟你们的后台开发人员协商好统一的错误状态码
    // 然后根据返回的状态码进行一些操作，例如登录过期提示，错误提示等等
    // 下面列举几个常见的操作，其他需求可自行扩展
    error => {
        if (error.response.status) {
            var loginUrl = "../account/login?returnurl=" + window.location.href;;
            switch (error.response.status) {
                // 401: 未登录
                // 未登录则跳转登录页面，并携带当前页面的路径
                // 在登录成功后返回当前页面，这一步需要在登录页操作。
                case 401:
                    window.location.href = loginUrl;
                    break;

                // 403 token过期
                // 登录过期对用户进行提示
                // 清除本地token和清空vuex中token对象
                // 跳转登录页面
                case 403:
                    if (parent)
                        parent.errortop('登录过期，请重新登录'); 
                    errortop('登录过期，请重新登录'); 
                    // 清除token
                    delCookie("authuser");
                    window.location.href = loginUrl;
                    break;

                // 404请求不存在
                case 404:
                    if (parent)
                        parent.errortop('网络请求不存在'); 
                    errortop('网络请求不存在'); 
                    break;
                // 其他错误，直接抛出错误提示
                default:
                    if (parent)
                        parent.errortop('error.response.data.message'); 
                    errortop('error.response.data.message');
                   
            }
            return Promise.reject(error.response);
        }
    });


// request拦截器
axios.interceptors.request.use(function (config) {
    if (config.url.toLowerCase().indexOf('account/userlogin') == -1) {
        ////比如是否需要设置 token
        config.headers = {
            "authorization": "Bearer " + getCookie("authuser"),
            'Content-Type': 'application/json'
        };
    } 
    return config
})



/**
* 封装get方法
*/

function get(url, params) {
    return new Promise((resolve, reject) => {
        axios.get(url, {
            params: params
        })
            .then(response => {
                resolve(response);
            })
            .catch(err => {
                reject(err)
            })
    })
}


/**
 * 封装post请求
 */

//  Form Data
//  headers: {
//    "Content-Type": 'application/x-www-form-urlencoded; charset=UTF-8'
//  }

// Form Data   Request payload//当headers为 json时是 request 方式发送请求    但是如果你们的后台是formData的方式接口 就传一个header进来 就可以 formData  需要qs序列化//因为我们后台是json接受的比较多 所以json在我这里是默认  可以根据自己的情况修改   这个需要json转字符串不然是乱码的
function post(url, params = {}, headers) {
    return new Promise((resolve, reject) => {
        if (headers == undefined) {
            axios.post(url, JSON.stringify(params), {
                headers: {
                    "Content-Type": "application/json;charset=UTF-8"
                }
            })
                .then(res => {
                    resolve(res);
                })
                .catch(err => {
                    reject(err)
                })
        } else {
            axios.post(url, QS.stringify(params), headers)
                .then(res => {
                    resolve(res);
                })
                .catch(err => {
                    reject(err)
                })
        }

    });
}

/**
 * 封装patch请求
 */

function patch(url, data = {}) {
    return new Promise((resolve, reject) => {
        axios.patch(url, data)
            .then(response => {
                resolve(response);
            }, err => {
                reject(err)
            })
    })
}

/**
 * 封装put请求
 */

function put(url, data = {}) {
    return new Promise((resolve, reject) => {
        axios.put(url, data)
            .then(response => {
                resolve(response);
            }, err => {
                reject(err)
            })
    })
}

function success(message, callback) {
    this.$message({
        message: message,
        duration: 500,
        type: 'success',　　//类型是成功
        onClose: () => {
            callback();
        }
    });
}


function failed(message, callback) {
    this.$message({
        message: message,
        duration: 1000,
        type: 'warning',　　//类型是成功
        onClose: () => {
            callback();
        }
    });
}

function alertvue(message, callback) {
    this.$message({
        message: message,
        duration: 500,
        onClose: () => {
            callback();
        }
    });
}

function errorvue(message, callback) {
    this.$message.error({
        message: message,
        duration: 500,
        onClose: () => {
            callback();
        }
    });
}

function errortop(message, callback) {
    parent.errortop(message, callback);
}

function getTableStyle() {
    var height = window.innerHeight;

    return {
        height: (window.innerHeight - 100) + 'px',
        width:"100%"
    };
}

function isNullOrEmpty(str) {
    if (str == null || str == "") return true;

    return false;
}





/**
* 设置cookie
* name cookie的名称
* value cookie的值
* day cookie的过期时间
*/

Vue.prototype.setCookie = function (name, value, day) {
   
    setCookie(name, value, day);
}

function setCookie(name, value, day) {
    var Days = 1;
    if (day != undefined) {
        Days = day;
    }
    var exp = new Date();
    exp.setTime(exp.getTime() + Days * 24 * 60 * 60 * 1000);
    document.path = "/";
    document.cookie = name + "=" + escape(value) + ";path=/;expires=" + exp.toGMTString();

}

function getCookie(name) {
    var arr;
    var reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
    if (arr = document.cookie.match(reg))
        return unescape(arr[2]);
    else
        return null;  
}

function delCookie(name) {
    var exp = new Date();
    exp.setTime(exp.getTime() - 1);
    var cval = getCookie(name);
    if (cval != null)
        document.cookie = name + "=" + cval + ";expires=" + exp.toGMTString();
}


Vue.prototype.getCookie = function (name) {

    return getCookie(name);
}



Vue.prototype.$axios = axios
Vue.prototype.$post = post;
Vue.prototype.$get = get;
Vue.prototype.$patch = patch;
Vue.prototype.$put = put;
Vue.prototype.$success = success;
Vue.prototype.$failed = failed;
Vue.prototype.$alert = alertvue;
Vue.prototype.$error = errorvue;
Vue.prototype.$addTab = parent.addTabToMain;
Vue.prototype.$back = parent.backToPre;
Vue.prototype.$isNullOrEmpty = isNullOrEmpty;